// 抽象类:包含抽象方法(抽象方法一般没有任何具体内容的实现),也可以包含实例方法,抽象类是不能被实例化,为了让子类进行实例化实现内部的抽象方法
// 抽象类的目的或者作用最终都是为子类服务的
;(() => {
  // 定义一个抽象类
  abstract class Animal {
    // 抽象方法
    // 抽象方法不能有具体的实现
    abstract eat()
    // 抽象属性
    abstract name: string
    sayHi() {
      console.log('哈哈哈哈')
    }
  }
  // 定义一个子类(派生类)Dog
  class Dog extends Animal {
    // 重新的实现抽象类中的方法,此时这个方法就是当前Dog类的实例方法了
    name: string = '小狗'
    eat() {
      console.log('heheheheh')
    }
  }
  const dog: Dog = new Dog()
  dog.eat()
  dog.sayHi()
  console.log(dog)

  // 不能实例化抽象类对象
  // const ani:Animal = new Animal()
})()
